package com.yanggu.spark.sql

import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession

//自定义UDAF -> 多进一出, 聚合的函数
/**
 * 强类型的Dataset和弱类型的DataFrame都提供了相关的聚合函数， 如 count()，countDistinct()，avg()，max()，min()。除此之外，用户可以设定自己的自定义聚合函数。通过继承UserDefinedAggregateFunction来实现用户自定义聚合函数。
 */
object SparkSQL03_UDAF_2 {

  def main(args: Array[String]): Unit = {

    //1. 创建上下文环境对象
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("SparkSQL03_UDAF_2")

    //2. 创建sparkSession对象
    val spark = SparkSession.builder().config(sparkConf).getOrCreate()

    //RDD => DateFrame => DataSet 转换需要引入隐式转换规则, 否则无法转换
    //spark不是包名, 而是sparkSession的对象名称
    import spark.implicits._

    val ds = spark.read.json("input/test.json").as[User01]

    ds.createOrReplaceTempView("user")

    //创建自定义的聚合函数
    val averageUDAF = new MyAverageUDAF2

    //将这个函数转成TypedColumn，并且提供一个别名
    val averAge = averageUDAF.toColumn

    //将聚合函数转换成字段之后, 就可以像其他字段一样使用了
    ds.select(averAge).show

    spark.stop
  }

}
